//Project name: personal-diary-bm
//Author: Brunner Márton (YV2X56)

#include <iostream>
#include <fstream>
#include <vector>
#include "menu.hpp"
#include "diary.hpp"
#include "fileHandling.hpp"


using namespace std;

void NewUser();
void MainMenu(vector<Entry*> &diary);
void ShowEntry(vector<Entry*> &diary, unsigned int &position);

int main(){
    bool exit=false;
    vector <Entry*> diary;
    ShowHeader("Udvozoljuk", false);
    while(!exit){
        string username, password;
        int a=Menu(3, false, "", "Uj felhasznalo letrehozasa", "Bejelentkezes", "Kilepes");
        switch (a){
            case 1 : NewUser(); break;
            case 2 : {
                try{
                    username=userInput("Kerem adja meg a felhasznalonevet:");
                    password=userInput("Kerem adja meg a jelszot:", 255);
                    LoadDiary(username, password, diary);
                    cout << "Sikeres bejelentkezes!\n";
                    MainMenu(diary);
                    SaveDiary(username, password, diary);
                    exit=true;
                }catch(DiaryOpenError e){
                    if(e==NoSuchFile){cout << "Nem talalhato a megadott nevu fajl!\n";}
                    else if(e==WrongFile){cout << "A fajl nem felel meg a program altal elvart kovetelmenyeknek!\n";}
                    else if(e==WrongPassword){cout << "A megadott jelszoval nem sikerult a naplo megnyitasa!\n";}
                }
                break;
            }
            default : exit=true; break;
        }
    }
    return 0;
}

//Új felhasználó létrehozása
void NewUser(){
    string un = "";
    string pw = "";
    ShowHeader("Uj felhasznalo letrehozasa");
    bool neml = false;

    while(!neml){ //Felhasználónév beolvasása, ellenõrizve, hogy van-e már ilyen nevû
        un=userInput("Kerem adja meg az uj felhasznalonevet:");
        ifstream tmpf;
        tmpf.open(toFileName(un).c_str());
        neml=!tmpf.is_open();
        if(!neml) cout << "Mar letezik ilyen nevu felhasznalo!" << endl;
    }

    pw=userInput("Kerem adja meg a jelszot:", 255);
    vector<Entry*> tmpvec;
    SaveDiary(un, pw, tmpvec);
    cout << "Felhasznalo sikeresen letrehozva!" << endl;
}

//Ez jeleníti meg a legutóbbi bejegyzéseket, amelyeket meg is lehet nyitni
void MainMenu(vector<Entry*> &diary){
    bool exit = false;
    unsigned int pos = diary.size();
    while(!exit){
        ShowHeader("Fomenu");
        cout << "Naplobejegyzesek:" << endl;
        if(diary.size()==0) cout << "Meg nincs egy bejegyzes se!" << endl;
        for(unsigned int i=pos; i+4>=pos && i>0; --i){
            cout << "  " << i << " " << diary.at(i-1)->getName() << endl;
        }
        int a=Menu(4, true, "", "Uj bejegyzes letrehozasa", "Bejegyzes megnyitasa", "Elozo oldal", "Kovetkezo oldal");
        switch(a){
            case 1 : { //Uj bejegyzes letrehozasa
                ShowHeader("Uj bejegyzes letrehozasa");
                int b=Menu(3, true, "", "Rovid bejegyzes letrehozasa", "Hosszu bejegyzes letrehozasa", "Weblink letrehozasa");
                if(b!=0){
                    Entry* en;
                    switch (b){
                        case 1 : ShowHeader("Rovid bejegyzes letrehozasa"); en=new ShortEntry(); break;
                        case 2 : ShowHeader("Hosszu bejegyzes letrehozasa"); en=new LongEntry(); break;
                        case 3 : ShowHeader("Weblink letrehozasa"); en=new WebAddress(); break;
                    }
                    diary.push_back(en);
                }
                pos=diary.size();
                break;
            }
            case 2 : { //Bejegyzes megnyitasa
                unsigned int tmp_position = userInput<unsigned int>("Kerem adja meg a megjeleniteni kivant bejegyzes sorszamat:")-1;
                if(tmp_position<diary.size() && tmp_position>=0) {
                    ShowEntry(diary, tmp_position);
                    pos=diary.size();
                } else{
                    cout << "Nem letezik ilyen sorszamu bejegyzes!" << endl;
                }
                break;
            }
            case 3 : //Elöző oldalra léptetés
                if(pos>=6) pos-=5; break;
            case 4 : //Következő oldalra léptetés
                if(pos+5<=diary.size()) pos+=5; break;
            default : exit=true; break;
        }
    }
}

//Bejegyzést megjelenítő metódus, itt van lehetőség a bejegyzés törlésére is
void ShowEntry(vector<Entry*> &diary, unsigned int &position){
    Entry* en=diary.at(position);
    ShowHeader("Bejegyzes megjelenites");
    cout << "Sorszam: " << position+1 << endl;
    cout << "Cim: " << en->getName() << endl << "Datum: " << en->getDate() << endl;
    if(en->EntryType()==1){ //Rövid szöveges bejegyzés
        ShortEntry* tmp = dynamic_cast <ShortEntry*> (en);
        cout << tmp->getText();
    }else if(en->EntryType()==2){ //Hosszó szöveges bejegyzés
        LongEntry* tmp = dynamic_cast <LongEntry*> (en);
        cout << "Rovid leiras: " << tmp->getBrief() << endl << tmp->getText();
    }else if(en->EntryType()==3){ //Weblink típusú bejegyzés
        WebAddress* tmp = dynamic_cast <WebAddress*> (en);
        cout << "Rovid leiras: " << tmp->getBrief() << endl << tmp->getWeblink();
    }
    cout << endl;
    int a=Menu(1, true, "", "Bejegyzes torlese");
    if(a==1) diary.erase(diary.begin()+position);
}
